4.5 使用POSIX字符类

对元字符以及各种字符集合进行的讨论,必须要提到 POSIX 字符类。POSIX 字符类是许多(但并不是所有)正则表达式实现都支持的一种简写形式。

注意

Javascript 不支持在正则表达式里使用 POSIX 字符类,也就是说本站提供的正则表达式练习工具不支持 POSIX 字符类。

POSIX 语法与我们此前见过的元字符不太一样。为了演示 POSIX 字符类的用法,我们来看前一章里的例子,利用正则表达式从一段 CSS 代码里把 RGB 值查找出来:

<RegexWidget
regex="#[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]"
textLanguage="css"
readOnly
text={body { background-color: #336633; color: #ffffff; margin: 0; padding: 0; box-sizing: border-box; }}
autoMatch={false}
result={["#336633", "#ffffff"]}

分析

在前一章里使用的模式是重复写出的 6 个 [0-9A-Fa-f] 字符集合,把那 6 个 [0-9A-Fa-f] 全部替换为 [[:xdigit:]] 就得到这个模式。它们的匹配结果完全一样。

注意

这里使用的模式以 [[ 开头、以 ]] 结束(两对方括号)。这是使用 POSIX 字符类所必须的。POSIX 字符类必须括在 [::] 之间,我们使用的 POSIX 字符类是 [:xdigit:] (不是 :xdigit: )。外层的 [] 字符用来定义一个字符集合,内层的 [] 字符是 POSIX 字符类本身的组成部分。

字符类 说明
[:alnum:] 任何一个字母或数字(等价于 [a-zA-Z0-9]
[:alpha:] 任何一个字母(等价于 [a-zA-Z]
[:blank:] 空格或制表符等价于 [\t ]
[:cntrl:] ASCII 控制字符(ASCII 0 到 31 和 ASCII 127)
[:digit:] 任何一个数字(等价于 [0-9]
[:print:] 任何一个可打印字符
[:graph:] [:print:] 一样,但不包括空格
[:lower:] 任何一个小写字母(等价于 [a-z]
[:upper:] 任何一个大写字母(等价于 [A-Z]
[:punct:] 既不属于 [:alnum:] 也不属于 [:cntrl:] 的其他字符
[:space:] 任何一个空白字符,包括空格(等价于 [\f\n\r\t\v ]
[:xdigit:] 任何一个 16 进制数字(等价于 [a-fA-F0-9]
警告

一般来说,支持 POSIX 标准的正则表达式实现都支持上表所列出的那 12 个 POSIX 字符类,但在一些细节方面可能会与这里的描述有细微的差异。

小结

我们在第二章第三章对字符匹配操作和字符集合匹配操进行了讨论。在此基础上,这一章对用来匹配特定字符(制表符、换行符,等等)和用来匹配一个字符集合或字符类(数字、字母数字字符,等等)的元字符进行了讲解。这些简短的元字符和 POSIX 字符类可以用来简化正则表达式模式。

发表评论